﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CoopSaude.DAO;
using CoopSaude.RHFinanceiro;

namespace CoopSaude.Dto
{
	public class FuncionarioDto
	{
		#region public properties

		public int Id { get; set; }
        public int IdDepartamento { get; set; }
		public string Nome { get; set; }
        public string CPF { get; set; }
        public string Endereco { get; set; }
        public string Cidade { get; set; }
        public string Estado { get; set; }
        public string Telefone1 { get; set; }
        public string Telefone2 { get; set; }
        public string RG { get; set; }
        public decimal SalarioHora { get; set; }
        public DateTime DataCadastro { get; set; }
        public bool Ativo { get; set; }
        public string AtendimentoPaciente { get; set; }
        public DateTime HorarioAtendimento { get; set; }

		#endregion

		#region constructors
		public FuncionarioDto()
		{
		}

        private FuncionarioDto(RHFinanceiro.SerializedFuncionario funcionario)
        {
            this.Id = Convert.ToInt32(funcionario.Id);
            this.IdDepartamento = funcionario.IdDepartamento;
            this.Nome = funcionario.Nome;
            this.CPF = funcionario.CPF;
            this.Endereco = funcionario.Endereco;
            this.Cidade = funcionario.Cidade;
            this.Estado = funcionario.Estado;
            this.Telefone1 = funcionario.Telefone1;
            this.Telefone2 = funcionario.Telefone2;
            this.RG = funcionario.RG;
            this.SalarioHora = funcionario.SalarioHora;
            this.DataCadastro = funcionario.DataCadastro;
            this.Ativo = funcionario.Ativo;
            //this.AtendimentoPaciente = funcionario.AtendimentoPaciente; //>> TODO: uncomment
            //this.HorarioAtendimento = funcionario.HorarioAtendimento;
        }
		#endregion

        #region static methods
        
        public static void CriarFuncionario(string tipo, int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora)
        {
            switch (tipo)
            {
                case "1":
                    var f = RHFinanceiroDAO.adicionarFisioterapeuta(IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora);
                    if (f == null) throw new Exception("impossível criar");
                    break;
                case "0":
                    var m = RHFinanceiroDAO.adicionarMedico(IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora);
                    if (m == null) throw new Exception("impossível criar");
                    break;
                default:
                    throw new Exception("tipo inválido");
            }
        }

        public static void CriarFuncionario(string tipo, FuncionarioDto funcionario)
        {
            CriarFuncionario(tipo, funcionario.IdDepartamento, funcionario.Nome, funcionario.CPF, funcionario.Endereco, funcionario.Cidade, funcionario.Estado, funcionario.Telefone1, funcionario.Telefone2, funcionario.RG, funcionario.SalarioHora);
        }

        public static FuncionarioDto obterFuncionario(int idFuncionario)
        {
            return new FuncionarioDto(RHFinanceiroDAO.obterFuncionario(idFuncionario));
        }

        public static FuncionarioDto[] VisualizarFuncionarios()
        {
            SerializedFuncionario[] funcionarios = RHFinanceiroDAO.visualizarFuncionarios();

            List<FuncionarioDto> listadto = new List<FuncionarioDto>();

            foreach ( SerializedFuncionario funcionario in funcionarios) 
                listadto.Add(new FuncionarioDto(funcionario));

            return listadto.ToArray();
        }

        public static void atualizarFuncionario(FuncionarioDto f)
        {
            RHFinanceiroDAO.atualizarFuncionario(f.Id, f.IdDepartamento, f.Nome, f.CPF, f.Endereco, f.Cidade, f.Estado, f.Telefone1, f.Telefone2, f.RG, f.SalarioHora, f.AtendimentoPaciente);
            //RHFinanceiroDAO.atualizarFuncionario(f.Id, f.IdDepartamento, f.Nome, f.CPF, f.Endereco, f.Cidade, f.Estado, f.Telefone1, f.Telefone2, f.RG, f.SalarioHora); //>> TODO: uncomment
        }

        public static void atualizarFuncionario(int IdFuncionario, int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora)
        {
            RHFinanceiroDAO.atualizarFuncionario(IdFuncionario, IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora, "");
            //RHFinanceiroDAO.atualizarFuncionario(IdFuncionario, IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora); //>> TODO: uncomment
        }

        public static void estabelecerPaciente(int idFuncionario, string idPaciente, DateTime? novoHorario)
        {
            //RHFinanceiroDAO.EstabelecerPaciente(idFuncionario, idPaciente, novoHorario); //>>TODO: UNCOMMENT
        }

        /*
        public static InfoSessaoDTO BuscarSessao(int idSessao)
        {
            return new InfoSessaoDTO(InfoSessaoDAO.VisualizarSessao(idSessao));
        }

        public static List<InfoSessaoDTO> ListarSessoes(string idFisioterapeuta, string idPaciente)
        {
            List<InfoSessaoDTO> sessoes = new List<InfoSessaoDTO>();
            foreach (var sessao in InfoSessaoDAO.ListarSessoes(idFisioterapeuta, idPaciente))
            {
                InfoSessaoDTO sessaoDto = new InfoSessaoDTO(sessao, idPaciente);
                sessoes.Add(sessaoDto);
            }
            return sessoes;
        }
        */
        
        #endregion
    }
}